

local kong = kong
local ngx = ngx
local string = string
local time = ngx.time
local null = ngx.null
local json = require "cjson"
local kong_shared = ngx.shared.kong

local env = require "kong.cmd.utils.env"
local log = require "kong.cmd.utils.log"
local singletons = require "kong.singletons"
local constants = require "kong.constants"
local uuid = require "kong.tools.utils".uuid

local plugin_name = ({...})[1]:match("^kong%.plugins%.([^%.]+)")
-- local http_sender = require "kong.plugins.plugin-manage.sender.http_sender"
local http_sender = require("kong.plugins." .. plugin_name .. ".sender.http_sender")

local DEFAULT_CONF_PATH          = "/etc/kong/"
local DEFAULT_CONF_NAME          = "kong.conf"
local DEFAULT_TMP_CONF_NAME      = "kong_tmp.conf"
local DEFAULT_BACKUP_CONF_FORMAT = "kong_%s_back.conf"

--- 查询环境变量
--@param env_name 环境变量名
local function get_env(env_name)
  local env_name = env_name
  if not env_name then
    local err = "环境变量名为空。"
    return nil, err
  end

  if not env then
    local err = "系统环境变量查询失败。"
    return nil, err
  end

  local env_list = env.read_all()

  if not env_list then
    local err = "系统环境变量列表为空。"
    return nil, err
  end

  if not env_list[env_name] then
  local err = "环境变量未找到。"
  return nil, err
  end

  return env_list[env_name]
end


--- 插件初始化
do
  local ok = get_env("KONG_UPDATE_SEEN_INTERVAL")
  if not ok then
    log.error("插件管理：环境变量\"KONG_UPDATE_SEEN_INTERVAL\"未配置")
  end
  local ok = get_env("KONG_PLUGINS_PATH")
  if not ok then
    log.error("插件管理：环境变量\"KONG_PLUGINS_PATH\"未配置")
  end
  local ok = get_env("KONG_CONF_PATH")
  if not ok then
    log.error("插件管理：环境变量\"KONG_CONF_PATH\"未配置")
  end
  local ok = get_env("KONG_CONF_NAME")
  if not ok then
    log.error("插件管理：环境变量\"KONG_CONF_NAME\"未配置")
  end
  local ok = get_env("KONG_POD_CLUSTER")
  if not ok then
    log.error("插件管理：环境变量\"KONG_POD_CLUSTER\"未配置")
  end
  local ok = get_env("KONG_CLUSTER_URL")
  if not ok then
    log.error("插件管理：环境变量\"KONG_CLUSTER_URL\"未配置")
  end
  local ok = get_env("KONG_CLUSTER_ID")
  if not ok then
    log.error("插件管理：环境变量\"KONG_CLUSTER_ID\"未配置")
  end
end


--- 查询环境变量列表
local function get_env_list()
  if not env then
    local err = "系统环境变量查询失败。"
    return nil, err
  end

  local env_list = env.read_all()

  return env_list
end


--- 查询配置文件路径
local function get_default_conf_path()
  local kong_conf_path, _ = kong_shared:get("KONG_CONF_PATH")
  if kong_conf_path then
    return kong_conf_path
  end

  local conf_path_env = get_env("KONG_CONF_PATH")
  if conf_path_env then
    kong_shared:set("KONG_CONF_PATH", conf_path_env)
    return conf_path_env

  else
    kong_shared:set("KONG_CONF_PATH", DEFAULT_CONF_PATH)
    return DEFAULT_CONF_PATH
  end
end


--- 查询配置文件名
local function get_default_conf_name()
  local kong_conf_name, _ = kong_shared:get("KONG_CONF_NAME")
  if kong_conf_name then
    return kong_conf_name
  end

  local conf_name_env = get_env("KONG_CONF_NAME")
  if conf_name_env then
    kong_shared:set("KONG_CONF_NAME", conf_name_env)
    return conf_name_env

  else
    kong_shared:set("KONG_CONF_NAME", DEFAULT_CONF_NAME)
    return DEFAULT_CONF_NAME
  end
end

--- 查询暂存文件名
local function get_default_tmp_conf_name()
  local kong_tmp_conf_name, _ = kong_shared:get("KONG_TMP_CONF_NAME")
  if kong_tmp_conf_name then
    return kong_tmp_conf_name
  end

  local tmp_name_env = get_env("KONG_TMP_CONF_NAME")
  if tmp_name_env then
    kong_shared:set("KONG_TMP_CONF_NAME", tmp_name_env)
    return tmp_name_env
  else
    kong_shared:set("KONG_TMP_CONF_NAME", DEFAULT_TMP_CONF_NAME)
    return DEFAULT_TMP_CONF_NAME
  end
end

--- 查询备份配置文件名格式
local function get_default_backup_conf_format()
  local backup_conf_format, _ = kong_shared:get("KOGN_BACKUP_CONF_FORMAT")
  if backup_conf_format then
    return backup_conf_format
  end

  local backup_conf_format_env = get_env("KOGN_BACKUP_CONF_FORMAT")
  if backup_conf_format_env then
    kong_shared:set("KOGN_BACKUP_CONF_FORMAT", backup_conf_format_env)
    return backup_conf_format_env
  else
    kong_shared:set("KOGN_BACKUP_CONF_FORMAT", DEFAULT_BACKUP_CONF_FORMAT)
    return DEFAULT_BACKUP_CONF_FORMAT
  end
end

--- 校验字符串是否为空
-- @param str 待校验字符串
local function is_present(str)
  return str and type(str) == "string" and str ~= "" and #str > 0 and str ~= null
end


--- 校验文件是否存在
-- @param absolute_path 待校验文件完整路径
local function file_exists(absolute_path)

  -- 尝试以只读模式打开文件
  local file = io.open(absolute_path, "r")

  -- 成功打开则关闭文件流
  if file then
    file:close()
  end

  return file ~= nil
end

return {
  get_env                        = get_env,
  get_env_list                   = get_env_list,
  get_default_conf_path          = get_default_conf_path,
  get_default_conf_name          = get_default_conf_name,
  get_default_tmp_conf_name      = get_default_tmp_conf_name,
  get_default_backup_conf_format = get_default_backup_conf_format,
  is_present                     = is_present,
  file_exists                    = file_exists
}
